package com.chris.libs.base.x.mvpp.activity;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import com.chris.libs.base.x.mvpp.manager.WindowManager;

import java.io.Serializable;
import java.util.Map;

/**
 * @author Chris Chan
 * on 2019/7/8 10:16
 * use for:
 */
public abstract class BaseActivity extends AppCompatActivity {
    /**
     * 主要内容布局控件
     */
    public View contentView;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        WindowManager.get().addActivity(this);
        preSetContentView(savedInstanceState);
        contentView = createContentView();
        setContentView(contentView);
        postContentView(savedInstanceState);
        onReady();
    }

    @Override
    protected void onDestroy() {
        WindowManager.get().removeActivity(this);
        super.onDestroy();
    }

    /**
     * 一切都准备好了
     */
    public void onReady() {
    }

    /**
     * 在设置完主要内容控件之后执行
     *
     * @param savedInstanceState
     */
    public void postContentView(Bundle savedInstanceState) {
        acceptArguments(savedInstanceState);
    }

    /**
     * 接收参数
     *
     * @param savedInstanceState
     */
    public void acceptArguments(Bundle savedInstanceState) {
    }

    /**
     * 创建主要内容布局
     * 一般在这里把布局文件实例化为控件
     *
     * @return
     */
    public abstract View createContentView();

    /**
     * 在设置主要内容布局之前执行
     *
     * @param savedInstanceState
     */
    public void preSetContentView(Bundle savedInstanceState) {
    }

    /**
     * 获取主要内容布局
     *
     * @return
     */
    public View getContentView() {
        return contentView;
    }

    /**
     * 跳转到其他的Activity
     * 适用于内部类
     *
     * @param packageContext
     * @param clazz
     */
    protected void startActivityFromTo(Context packageContext, Class<?> clazz) {
        startActivity(new Intent(packageContext, clazz));
        afterStartActivity();
    }

    /**
     * 跳转到其他的Activity并结束
     * 适用于内部类
     *
     * @param clazz
     */
    protected void startActivityFromToAndFinished(Context packageContext, Class<?> clazz) {
        startActivity(new Intent(packageContext, clazz));
        afterStartActivity();
        finish();
    }

    /**
     * 跳转到其他的Activity
     *
     * @param clazz
     */
    protected void startActivity(Class<?> clazz) {
        startActivity(new Intent(this, clazz));
        afterStartActivity();
    }

    /**
     * 跳转到其他的Activity并且结束当前的Activity
     *
     * @param clazz
     */
    protected void startActivityAndFinished(Class<?> clazz) {
        startActivity(clazz);
        afterStartActivity();
        finish();
    }

    /**
     * 跳转到其他的Activity并且携带数据
     *
     * @param clazz
     * @param key
     * @param value
     */
    protected void startActivityWithExtra(Class<?> clazz, String key, Serializable value) {
        Intent intent = new Intent(this, clazz);
        intent.putExtra(key, value);
        startActivity(intent);
        afterStartActivity();
    }

    protected void startActivityWithExtraMap(Class<?> clazz, Map<String, Serializable> map) {
        Intent intent = new Intent(this, clazz);
        for (Map.Entry<String, Serializable> entry : map.entrySet()) {
            intent.putExtra(entry.getKey(), entry.getValue());
        }
        startActivity(intent);
        afterStartActivity();
    }

    /**
     * 携带数据跳转到其他的Activity，并且结束当前Activity
     *
     * @param clazz
     * @param key
     * @param value
     */
    protected void startActivityWithExtraAndFinished(Class<?> clazz, String key, Serializable value) {
        startActivityWithExtra(clazz, key, value);
        afterStartActivity();
        finish();
    }

    /**
     * 通过Intent对象跳转到其他Activity，并且结束当前Activity
     *
     * @param intent
     */
    protected void startActivityIntentAndFinished(Intent intent) {
        startActivity(intent);
        afterStartActivity();
        finish();
    }

    /**
     * 跳转到其他Activity并处理返回结果
     *
     * @param clazz
     * @param requestCode
     */
    protected void startActivityForResult(Class<?> clazz, int requestCode) {
        startActivityForResult(new Intent(this, clazz), requestCode);
        afterStartActivity();
    }

    /**
     * 跳转到其他Activity并处理返回结果
     *
     * @param clazz
     */
    protected void startActivityForResult(Class<?> clazz) {
        startActivityForResult(new Intent(this, clazz), 0);
        afterStartActivity();
    }

    @Override
    public void finish() {
        super.finish();
        afterFinish();
    }

    /**
     * 在开启另一个页面之后紧接着执行
     * 初衷是为了自定义页面跳转动画
     */
    public void afterStartActivity() {
    }

    /**
     * 在页面结束之后执行
     * 初衷是为了自定义返回动画
     */
    public void afterFinish() {
    }
}
